package com.zrrd.javaSEPlus._04_reflect;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author WanJl
 * @version 1.0
 * @title ReflectMethod01
 * @description
 * @create 2023/11/12 16:53
 */
public class ReflectMethod01 {
    /**
     * Method[] getMethods()返回所有公共成员方法对象的数组，包括继承的
     * @throws Exception
     */
    public static void method01() throws Exception{
        //1.获取Class对象
        Class<Student> clazz = Student.class;
        //2.获取Method对象
        Method[] methods = clazz.getMethods();
        for(Method m:methods){
            System.out.println(m);
        }
    }

    /**
     * Method[] getDeclaredMethods()返回所有成员方法对象的数组，不包括继承的
     * @throws Exception
     */
    public static void method02() throws Exception{
        //1.获取Class对象
        Class<Student> clazz = Student.class;
        //2.获取Method对象
        Method[] methods = clazz.getDeclaredMethods();
        for(Method m:methods){
            System.out.println(m);
        }

    }

    /**
     * Method getMethod(String name, Class<?>... parameterTypes)返回单个公共成员方法对象
     * 可以获取到继承的方法
     * @throws Exception
     */
    public static void method03() throws Exception{
        //1.获取Class对象
        Class<Student> clazz = Student.class;
        //2.获取Method对象  第一个参数是要获取的方法名称，第二个以后的参数是这个方法的参数类型
        Method method = clazz.getMethod("method02", int[].class);
        System.out.println(method);
        Method method1 = clazz.getMethod("toString");
        System.out.println(method1);

    }

    /**
     * Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回单个成员方法对象
     * 获取不到继承的方法，但是可以获取到重写之后的方法。因为重写的方法算是本类当中方法。
     * @throws Exception
     */
    public static void method04() throws Exception{
        //1.获取Class对象
        Class<Student> clazz = Student.class;
        //2.获取Method对象  第一个参数是要获取的方法名称，第二个以后的参数是这个方法的参数类型
        Method method = clazz.getDeclaredMethod("getAge");
        System.out.println(method);
        Method method1 = clazz.getDeclaredMethod("toString");
        System.out.println(method1);
    }

    public static void main(String[] args) throws Exception {
        //method01();
        //method02();
        //method03();
        method04();
    }
}
